"""
@Author  : 刘文豪
@desc    : 供应商页面
@Time    : 2025/8/10
"""

import time
from typing import Any

from base.base import Base
from util import GetLog
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class PageGysGys(Base):

    def __init__(self,driver):
        super().__init__(driver)
        self.driver = driver
        self.logger = GetLog.get_log()
        # 元素初始化
        # 列表面包屑
        self.el_mbx = (By.XPATH,"//button[@class='el-button']")
        # 新增按钮
        self.el_insert_btn = (By.XPATH, "//div[@class='control-btn']//button[1]//span[1]")
        # 税号输入框
        self.el_sh = (By.XPATH,"(//input[@type='text'])[1]")
        # 是否关联方选择框
        self.el_glf = (By.XPATH,"(//input[@role='combobox'])[2]")
        # 是否关联方选择框-否
        self.el_glf_f = (By.XPATH, "(//li[@role='option'])[4]")
        # 款项性质
        self.el_gxxz = (By.XPATH, "(//input[@role='combobox'])[3]")
        # 款项性质-材料
        self.el_gxxz_cl = (By.XPATH, "(//li[@role='option'])[12]")
        # 是否通过认证
        self.el_sftgrz = (By.XPATH, "(//input[@role='combobox'])[4]")
        # 是否通过认证-是
        self.el_sftgrz_s = (By.XPATH, "(//li[@role='option'])[13]")
        # 是否为代理商
        self.el_sfdls = (By.XPATH, "(//input[@role='combobox'])[5]")
        # 是否为代理商-是
        self.el_sfdls_s = (By.XPATH, "(//li[@role='option'])[15]")

        # 供应商来源
        self.el_gysly = (By.XPATH, "(//input[@role='combobox'])[6]")
        # 供应商来源-互联网
        self.el_gysly_hlw = (By.XPATH, "//span[contains(text(),'互联网')]")

        # 签约方式
        self.el_qyfs = (By.XPATH, "(//input[@role='combobox'])[7]")
        # 签约方式-其他
        self.el_qyfs_kjxy = (By.XPATH, "(//li[@role='option'])[26]")



        # 合同简称
        self.el_htjc = (By.XPATH, "(//input[@type='text'])[13]")
        # 新增、编辑、详情页面-保存按钮
        self.el_alert_confirm = (By.XPATH, "//div[@class='group group-btn group-btn2']//button[1]//span[1]")
        # 新增、编辑、详情页面-取消按钮
        self.el_alert_cancel = (By.XPATH, "//div[@class='group group-btn group-btn2']//button[1]//span[1]")

        # 表格第一行-编辑按钮
        self.el_table_edit_btn = (By.XPATH, "//body[1]/div[1]/div[1]/div[1]/div[1]/section[1]/main[1]/main[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[17]/div[1]/div[1]/button[2]/span[1]")
        # 表格第一行-删除按钮
        self.el_table_delete_btn = (By.XPATH, "//body[1]/div[1]/div[1]/section[1]/section[1]/main[1]/div[1]/div[2]/div[2]/div[1]/div[3]/div[1]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[4]/div[1]/button[3]/span[1]")
        # 表格第一行-删除按钮的弹窗确定按钮
        self.el_table_delete_confirm_btn = (By.XPATH,"//body[1]/div[3]/div[1]/div[1]/div[3]/button[2]/span[1]")

        # 新增用户"//div[@class='operationBtn']//span[1]"
        self.el_xzyh = (By.XPATH, "//div[@class='operationBtn']//span[1]")
        # 联系人
        self.el_lxr = (By.XPATH, "(//input[@type='text'])[14]")
        # 手机号码
        self.el_sjhm = (By.XPATH, "(//input[@type='text'])[15]")
        # 电子邮箱
        self.el_dzyy = (By.XPATH, "(//input[@type='text'])[16]")
        # 用户类型-选择框
        self.el_yhlx = (By.XPATH, "(//input[@role='combobox'])[10]")
        # 用户类型-报价
        self.el_yhlx_bj = (By.XPATH, "(//span[contains(text(),'报价')])[2]")

        # 查询
        # 查询-企业名称
        self.el_qymc = (By.XPATH, "(//input[@type='text'])[2]")
        # 查询-查询按钮
        self.el_query_btn = (By.XPATH, "//div[@class='table-search']//button[1]//span[1]")
        self.el_reset_btn =  (By.XPATH, "(//*[name()='svg'])[30]")
        # 企业名称搜索结果
        self.el_table_qymc = (By.XPATH, "(//div[contains(text(),'1')])[17]")

        # 详情
        # 详情按钮
        self.el_xq_btn = (By.XPATH, "//tbody/tr[1]/td[17]/div[1]/div[1]/button[1]/span[1]")
        # 详情-取消按钮
        self.el_xqqx_btn = (By.XPATH, "//button[@type='button']//span[1]")

    # 新增
    def page_insert(self, req_data: dict[str, Any]):
        try:
            # 1. 打开新增页面/弹窗 简化写法-调用父类封装方法
            self.base_click_u(self.el_insert_btn)
            self.logger.info("供应商页面-到新增页面")

            # 2. 等待模态框加载完成（通常通过判断模态框的标题或某个特征元素是否出现）简化写法
            self.base_until_el(self.el_alert_confirm)
            self.logger.info("供应商页面-找到新增页面的保存按钮")

            # 3. 填写名称字段
            # 简化写法-调用父类封装方法 填写字段
            # 输入税号
            self.base_input(self.el_sh, req_data.get("sh"))
            self.logger.info("供应商页面-新增页面-税号-输入成功")
            # 点击是否关联方-下拉选择框
            self.base_click_u(self.el_glf)
            self.logger.info("供应商页面-新增页面-是否关联方-点击成功")
            # 选择下拉框-否
            self.base_click_u(self.el_glf_f)
            self.logger.info("供应商页面-新增页面-是否关联方-选择成功")

            # 选择款项性质-下拉选择框
            self.base_click_u(self.el_gxxz)
            self.logger.info("供应商页面-新增页面-款项性质-点击成功")
            # 选择下拉框-款项性质
            self.base_click_u(self.el_gxxz_cl)
            self.logger.info("供应商页面-新增页面-是否关联方-选择成功")

            # 选择是否通过认证-下拉选择框
            self.base_click_u(self.el_sftgrz)
            self.logger.info("供应商页面-新增页面-是否通过认证-点击成功")

            # 选择下拉框-通过认证否
            self.base_click_u(self.el_sftgrz_s)
            self.logger.info("供应商页面-新增页面-是否通过认证-选择成功")

            # 选择是否为代理商-下拉选择框
            self.base_click_u(self.el_sfdls)
            self.logger.info("供应商页面-新增页面-是否为代理商-点击成功")
            # 选择下拉框-通过认证否
            self.base_click_u(self.el_sfdls_s)
            self.logger.info("供应商页面-新增页面-是否通过认证-选择成功")

            # 选择签约方式-下拉选择框
            self.base_click_u(self.el_qyfs)
            self.logger.info("供应商页面-新增页面-签约方式-点击成功")
            # 选择下拉框-框架协议
            self.base_click_u(self.el_qyfs_kjxy)
            self.logger.info("供应商页面-新增页面-签约方式-选择成功")

            # 输入合同简称
            self.base_input(self.el_htjc, req_data.get("htjc"))
            self.logger.info("供应商页面-新增页面-合同简称-输入成功")
            # 点击确定按钮提交
            self.base_click_u(self.el_alert_confirm)
            self.logger.info("供应商页面-新增数据成功")
            time.sleep(3)

        except Exception as e:
            self.logger.error(e)
            self.logger.error("供应商页面-点击新增按钮成功操作元素失败")
            raise

    # 编辑
    def page_edit(self, req_data: dict[str, Any]):
        try:
            # 1. 打开编辑页面 简化写法-调用父类封装方法
            self.base_click_u(self.el_table_edit_btn)
            self.logger.info("供应商页面-到编辑页面")
            # 2. 等待模态框加载完成（通常通过判断模态框的标题或某个特征元素是否出现）
            self.base_until_el(self.el_alert_confirm)
            self.logger.info("供应商页面-找到编辑页面的保存按钮")
            # 3. 填写名称字段
            # 选择供应商来源-下拉选择框
            self.base_click_u(self.el_gysly)
            self.logger.info("供应商页面-编辑页面-供应商来源-点击成功")
            # 选择下拉框-通过认证否
            self.base_click_u(self.el_gysly_hlw)
            self.logger.info("供应商页面-编辑页面-供应商来源互联网-选择成功")
            # 简化写法-调用父类封装方法
            # self.base_click_u(self.el_xzyh)
            # self.logger.info("供应商页面-新增用户按钮点击成功")
            # time.sleep(2)
            # # 联系人
            # self.base_input(self.el_lxr, req_data.get("lxr"))
            # self.logger.info("供应商页面-编辑页面的联系人输入成功")
            # # 手机号码
            # self.base_input(self.el_sjhm, req_data.get("sjhm"))
            # self.logger.info("供应商页面-编辑页面的手机号码输入成功")
            # # 电子邮箱
            # self.base_input(self.el_dzyy, req_data.get("dzyy"))
            # self.logger.info("供应商页面-编辑页面的电子邮箱输入成功")
            #
            # # 点击下拉选择框-用户类型
            # self.base_click_u(self.el_yhlx)
            # self.logger.info("供应商页面-编辑页面-用户类型点击成功")
            # # 下拉选择框选择数据，选择第一个选项
            # self.base_click_u(self.el_yhlx_bj)
            # self.logger.info("供应商页面-编辑页面-用户类型选择成功")
            time.sleep(1)
            # 点击确定按钮提交
            self.base_click_u(self.el_alert_confirm)
            self.logger.info("供应商页面-编辑数据成功")
        except Exception as e:
            self.logger.error(e)
            self.logger.error("供应商页面-编辑页面-操作元素失败")
            raise

    # 获取列表上的面包蟹
    def page_get_mbx(self):
        return self.base_get_value(self.el_mbx)

    # 获取按企业名称搜索结果
    def page_get_qymc(self):
        return self.base_get_value(self.el_table_qymc)



    # 按单元名称查询
    def page_query(self,req_data: dict[str, Any]):
        try:
            # 输入单元名称
            self.base_input(self.el_qymc, req_data.get("qymc"))
            self.logger.info("页面-企业名称查询-输入单元名称成功")
            # 点击查询按钮
            self.base_click_u(self.el_query_btn)
            self.logger.info("页面-企业名称查询-点击查询按钮成功")
            time.sleep(2)
            # 调用重置搜索
            self.page_reset_query()

        except Exception as e:
            self.logger.error("页面-企业名称查询-操作元素失败")
            raise

    # 重置查询
    def page_reset_query(self):
        try:
            # 点击查询按钮
            self.base_click(self.el_reset_btn)
            self.logger.info("页面-重置查询-点击重置按钮成功")
        except Exception as e:
            self.logger.error("页面-重置查询-操作元素失败")
            raise

    # 详情
    def page_detail(self, req_data: dict[str, Any]):
        try:
            #
            self.base_click_u(self.el_xq_btn)
            self.logger.info("页面-点击详情-成功")
            time.sleep(2)
            value = self.base_get_value(self.el_xqqx_btn)
            # 点击取消按钮
            self.base_click_u(self.el_xqqx_btn)
            self.logger.info("页面-点击取消-成功")
            return value

        except Exception as e:
            self.logger.error("页面-详情-操作元素失败")
            raise

    # 删除
    def page_delete(self):
        try:
            # 点击按钮
            self.base_click_u(self.el_table_delete_btn)
            self.logger.info("供应商页面-删除按钮-点击删除按钮成功")
            # 2. 等待模态框加载完成（通常通过判断模态框的标题或某个特征元素是否出现）
            WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located(self.el_table_delete_confirm_btn)  # 判断新增页面保存按钮是否出现
            )
            self.logger.info("供应商页面-找到删除页面的确定按钮")
            self.base_click_u(self.el_table_delete_confirm_btn)
            self.logger.info("供应商页面-删除页面的确定按钮点击成功")


        except Exception as e:
            self.logger.error("页面-重置查询-操作元素失败")
            raise